package com.tangsm.spring.boot.strategy.demo.base;


import com.tangsm.spring.boot.strategy.demo.domain.Message;
import com.tangsm.spring.boot.strategy.demo.util.RandomUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * 对外发送信息
 * @author tangyb
 * @date 2021/11/25 10:53
 */
public abstract class SendMessageSuper {
	protected static final Logger log = LoggerFactory.getLogger(SendMessageSuper.class);

	private RedisTemplate<String, String> redisTemplate;

	/**
	 * 发送消息验证码接口
	 * @param message 消息参数
	 * @return 响应结果
	 */
	public String send(Message message) {
		log.info("SendMessageSuper，发送消息验证码执行入口，target={}，type={}", message.getTarget(), message.getType());

		// 实例初始化
		init();

		// 缓存验证码
		if(message.getIsValidCode()) {
			String code = RandomUtils.generateNumber(6);
			cacheCode(message.getTarget(), message.getType(), code);
		}

		// 各通道策略业务实现
		transportBusiness(message);

		return "成功";
	}

	/**
	 * 各通道策略业务实现
	 * @param message 消息参数
	 */
	protected abstract void transportBusiness(Message message);

	/**
	 * 缓存验证码
	 * @param target 发送目标，手机号码或邮箱
	 * @param type 消息类型
	 * @param code 验证码
	 */
	protected void cacheCode(String target, String type, String code) {
		log.info("缓存验证码，target={}，type={}, code={}", target, type, code);

		// redis缓存，有效时间1分钟
		redisTemplate.opsForValue().set(String.format("target:%s:%s", type, target),
				code, 1L, TimeUnit.MINUTES);
	}

	/**
	 * 初始化RedisTemplate对象
	 */
	private void init() {
		redisTemplate = setRedisTemplate();
	}

	/**
	 * 初始化 redisTemplate对象
	 */
	protected abstract RedisTemplate<String, String> setRedisTemplate();
}
